package it.poste.il.compensatore.datamanager.impl;

import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;

import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;

import it.poste.il.compensatore.entity.Message;
import it.poste.il.compensatore.entity.MessageBody;
import it.poste.il.compensatore.entity.MessageStatus;
import it.poste.il.compensatore.entity.Operation;
import it.poste.il.compensatore.entity.SDPRequest;

import it.poste.il.compensatore.dao.MessageDao;
import it.poste.il.compensatore.dao.MessageStatusDao;
import it.poste.il.compensatore.dao.OperationDao;
import it.poste.il.compensatore.dao.SDPRequestDao;

public class DataManagerImpl {
	@Autowired
	SDPRequestDao sdpRequestDao;
	
	@Autowired
	MessageDao msgDao;
	
	@Autowired
	OperationDao operationDao;
	
	@Autowired
	MessageStatusDao messageStatusDao;
	
	private Logger logger = Logger.getLogger("myLog");
	
	/**
	 * Metodo storeMsg.
	 * Restituisce il nuovo message Id generato.
	 * @return valore del messageId;
	 */
	public Message storeMsg(String msg, SDPRequest requestId){
		Message message = new Message();
		//SDPRequest
		message.setSdpRequestId(requestId);
		
		//tipo dritta
		message.setType(1);
		
		//Operation
		Operation operation = new Operation();
		operation.setId(new Long(requestId.getNumberOperationPdl()));
		List<Operation> opList = operationDao.loadByFilter(operation);
		message.setOperationId(opList.get(0));
		
		//MessageBody
		MessageBody messageBody = new MessageBody();
		messageBody.setInputMessage(msg);
		messageBody.setMessage(message);
		
		//MessageStatus 1 = invio in corso
		MessageStatus messageStatus = new MessageStatus();
		messageStatus = messageStatusDao.loadById(new Long(1));
		message.setStatusId(messageStatus);
		
		return msgDao.save(message);
	}
		
	/**
	 * Metodo verifyRequest.
	 * Restituisce l'esito della verifica. 1 se non duplicato, 2 se da annullare, 3 se da riallineare
	 * @return esito verifica;
	 */
	public int verifyRequest(SDPRequest requestId){
		
		SDPRequest req = new SDPRequest();
		
		//entity SDPRequest senza la count
		req.setAccountingDate(requestId.getAccountingDate());
		req.setBranch(requestId.getBranch());
		req.setNumberOperationPdl(requestId.getNumberOperationPdl());
		req.setWorkingStationId(requestId.getWorkingStationId());
		
		//message con associata la SDPRequest req
		Message msg = new Message();
		msg.setSdpRequestId(req);
		
		//stato del messaggio ad eseguito
		MessageStatus msgStatus = new MessageStatus();
		msgStatus.setId(new Long(3));
		msg.setStatusId(msgStatus);
		
		//tipo del messaggio dritto
		msg.setType(1);
		
		//contatore dell'ultimo messaggio elaborato correttamente presente sul db
		// DA IMPLEMENTARE  
		int counter = msgDao.loadLastMessage(msg);
		
		//contatore del messaggio ricevuto da SDP
		int counterRequest = requestId.getCounter();
		
		if(counterRequest==counter+1){
			//ok elabora
			return 1;
		} else if(counterRequest == counter){
			//ANNULLA counter
			return 2;
		} else if(counterRequest < counter || counterRequest > counter+1){
			//RIALLINEA
			return 3;
		}
		return 0;
	
		
		
//		List<SDPRequest> sdpRequestList;
//		sdpRequestList = sdpRequestDao.loadByFilter(requestId);
//		
//		if(sdpRequestList.isEmpty()){
//			//prendi l'ultima sdprequest
//			requestId.setCounter(requestId.getCounter()-1);
//			sdpRequestList = sdpRequestDao.loadByFilter(requestId);
//			for(Iterator iterator = sdpRequestList.iterator(); iterator.hasNext();) {
//				SDPRequest req = (SDPRequest) iterator.next();
//				Message msg = new Message();
//				msg.setSdpRequestId(req);
//				msg.setType(1);
//				int status = msgDao.selectStatusId(msg);
//			}
//		}
//			
//			
//		for (Iterator iterator = sdpRequestList.iterator(); iterator.hasNext();) {
//			SDPRequest req = (SDPRequest) iterator.next();
//			Message msg = new Message();
//			msg.setSdpRequestId(req);
//			//messaggio da sdp
//			msg.setType(1);
//			int status = msgDao.selectStatusId(msg);
//			logger.info("Status = " + status);
//			//condizione per generare un annullo per un messaggio ricevuto da sdp
//			if (status == 3 || status == 4 || status == 6)
//				return true;
//		}		
//		return false;
	}
	
	/**
	 * Metodo getRoutingInfo.
	 * Restituisce le informazioni di routing
	 * @return operation;
	 */
	public Operation getRoutingInfo(String requestId){
		return new Operation();
	}
	
	/**
	 * Metodo createAvoidMessage.
	 * Restituisce il messaggio di annullamento per la richiesta requestId.
	 * @return messaggio di annullamento;
	 */
	public String createAvoidMessage(String requestId){
		return "avoid";
	}
	
	/**
	 * Metodo sendRequest.
	 * Restituisce il messaggio di annullamento per la richiesta requestId.
	 * @return restituisce il messaggio di risposta ;
	 */
	public String sendRequest(String msg){
		return "send";
	}
}
